package com.dtp.core.notify.invoker;

import com.dtp.common.em.NotifyItemEnum;
import com.dtp.common.pattern.filter.Invoker;
import com.dtp.core.context.AlarmCtx;
import com.dtp.core.context.BaseNotifyCtx;
import com.dtp.core.context.DtpNotifyCtxHolder;
import com.dtp.core.handler.NotifierHandler;
import com.dtp.core.notify.alarm.AlarmCounter;
import lombok.val;

/**
 * 警报调用类
 *
 * @author yanhom
 * @since 1.0.8
 *
 * @remark muse
 */
public class AlarmInvoker implements Invoker<BaseNotifyCtx> {
    @Override
    public void invoke(BaseNotifyCtx context) {
        // 步骤1：获得警报信息并保存到警报上下文中
        val alarmCtx = (AlarmCtx) context;                      // 报警上下文
        val executorWrapper = alarmCtx.getExecutorWrapper();    // 包装执行器
        val notifyItem = alarmCtx.getNotifyItem();              // 通知项
        val alarmInfo = AlarmCounter.getAlarmInfo(executorWrapper.getThreadPoolName(), notifyItem.getType()); // 报警信息
        alarmCtx.setAlarmInfo(alarmInfo);                       // 设置报警信息（包含：通知类型、上一次报警时间、计数器）

        // 步骤2：发送报警信息
        try {
            DtpNotifyCtxHolder.set(context); // 将上下文context保存到ThreadLocal中
            NotifierHandler.getInstance().sendAlarm(NotifyItemEnum.of(notifyItem.getType())); // 发送警告
            AlarmCounter.reset(executorWrapper.getThreadPoolName(), notifyItem.getType()); // 重置警告
        } finally {
            DtpNotifyCtxHolder.remove(); // 将上下文从ThreadLocal中移除
        }
    }
}
